# -*- coding: utf-8 -*-
# 姓名:谚语
# 开发时间:2022/10/10 20:05
import logging
import logging.handlers
from flask import request
import os

'''
定义了日志的格式
'''


class RequestShoppingFormatter(logging.Formatter):
    """
    自定义的日志输出格式
    record就是一条完整的日志记录包含请求地址和客户端的IP地址
    """

    def format(self, record):
        record.url = request.url  # 需要再日志中记录请求地址
        record.remote_addr = request.remote_addr  # 需要在日志中记录客户端的IP地址
        return super().format(record)


# 创建一个个性化的logger对象(记录日志的对象)
def create_logger(app):
    """
    设置日志配置
    :param app: Flask中的app对象
    :return:
    """
    logging_file_dir = app.config['LOGGING_FILE_DIR']  # 日志文件所在的目录
    logging_file_max_bytes = app.config['LOGGING_FILE_MAX_BYTES']  # 日志文件最大的大小
    logging_file_backup = app.config['LOGGING_FILE_BACKUP']  # 保留备份的日志文件个数
    logging_level = app.config['LOGGING_LEVEL']  # 默认的日志级别

    # 设置日志的输出格式(针对文件)
    request_formatter = RequestShoppingFormatter(
        # 时间  客户端的IP地址  请求的url地址  级别  在哪个模块输出的日志  在哪一行输出的日志  输出的日志具体是什么内容
        '[%(asctime)s] %(remote_addr)s 请求 %(url)s \t 请求 %(levelname)s 在%(module)s %(lineno)d : %(message)s')

    # 检查如果目录不存在则创建目录
    if os.path.isdir(logging_file_dir):
        pass
    else:
        os.mkdir(logging_file_dir)  # 如果目录不存在，创建

    # 自定义一个目录和日志文件，RotatingFileHandler : 按照指定的文件大小来规定日志文件的生产规则。
    # 第一个参数 (日志文件最终存放在哪个目录下,名字叫什么)
    # 第二个参数 文件最大的大小
    # 第三个参数 备份文件的数量
    # flask_file_handler = logging.handlers.RotatingFileHandler(filename=os.path.join(logging_file_dir, 'financial.log'),
    #                                                           maxBytes=logging_file_max_bytes,
    #                                                           backupCount=logging_file_backup)

    # 为了让一个进程操作一个文件，所以文件名命名: 加上当前进程的ID【os.getpid()】
    # TimedRotatingFileHandler : 根据时间，来规定日志文件的生成规则。
    # 第一个参数 (日志文件最终存放在哪个目录下,名字叫什么)
    # 第二个参数 用的是什么时间(S:按照秒生成  M:按照分钟  H:按照小时  D:按照天), 第三个参数 几天生成一个日志文件
    # 第四个参数 备份文件的数量
    flask_file_handler = logging.handlers.TimedRotatingFileHandler(
        filename=os.path.join(logging_file_dir, 'financial'+'_'+str(os.getpid())+'.log'),
        when='D', interval=1,
        backupCount=logging_file_backup)

    # 给当前的handler设置格式
    flask_file_handler.setFormatter(request_formatter)
    # 得到一个logger对象，根据包的名字
    flask_logger = logging.getLogger('financial')
    # 给logger对象设置handler
    flask_logger.addHandler(flask_file_handler)
    # 设置默认的日志级别
    flask_logger.setLevel(logging_level)

    # 整个项目需要两个handler: 文件(上面代码)，控制台(下面代码)
    flask_console_handler = logging.StreamHandler()
    flask_console_handler.setFormatter(
        logging.Formatter('[%(asctime)s] %(levelname)s %(module)s %(lineno)d : %(message)s'))

    # 当前项目运行环境debug,才用控制台输出
    if app.debug:
        flask_logger.addHandler(flask_console_handler)
